package com.atguigu.gmall.all.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.list.client.ListFeignClient;
import com.atguigu.gmall.model.list.SearchParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author mqx
 * @date 2020-8-5 10:19:04
 */
@Controller
public class ListController {

    // 远程调用
    @Autowired
    private ListFeignClient listFeignClient;

    // http://list.gmall.com/list.html?category3Id=61
    @GetMapping("list.html")
    public String search(SearchParam searchParam, Model model){
        // 获取查询结果数据
        Result<Map> result = listFeignClient.list(searchParam);
        // 后台对应要存储数据
        // trademarkList 品牌集合 SearchResponseVo.trademarkList
        model.addAllAttributes(result.getData());

        // 通过三级分类Id http://list.gmall.com/list.html?category3Id=61
        // http://list.gmall.com/list.html?category3Id=61&trademark=2:华为
        // 通过searchParam 对象来确定用户的检索条件是什么？
        String urlParam = makeUrlParam(searchParam);

        // 页面需要 trademarkParam
        String trademark = makeTrademark(searchParam.getTrademark());

        // 存储平台属性 ${propsParamList} 页面需要
        List<Map<String, String>> propsList = makeProps(searchParam.getProps());

        // 页面需要一个 ${orderMap.type} 指按照哪个字段进行排序
        // ${orderMap.sort} 指按照哪个排序规则进行排序
        /*
            class OrderMap{
                Long type;
                String sort;
            }
            看作一个Map
            map.put("type",1);
            map.put("sort","desc");
         */
        Map<String, Object> map = orderDetail(searchParam.getOrder());

        // 保存排序规则！
        model.addAttribute("orderMap",map);
        // 存储平台属性
        model.addAttribute("propsParamList",propsList);
        // 条件拼接记录者 ${urlParam}
        model.addAttribute("urlParam",urlParam);

        // 前台需要存储一个searchParam
        model.addAttribute("searchParam",searchParam);
        // 存储品牌的
        model.addAttribute("trademarkParam",trademark);
        return "list/index";
    }
    // &order=1:asc  按照综合 升序排列
    private Map<String,Object> orderDetail(String order){
        Map<String,Object> map = new HashMap<>();
        // 判断传递的数据不能为空！
        if (!StringUtils.isEmpty(order)){
            // order=1:asc 拆分数据
            String[] split = order.split(":");
            if (split!=null && split.length==2){
                map.put("type",split[0]);
                map.put("sort",split[1]);
            }
        }else {
            // 给一个默认的排序规则
            map.put("type","1");
            map.put("sort","asc");
        }
        return map;
    }
    // 获取平台属性数据
    private List<Map<String,String>> makeProps(String[] props){
        // 声明一个集合
        List<Map<String,String>> list = new ArrayList<>();
        if (props!=null && props.length>0){
            // 循环遍历
            for (String prop : props) {
                // prop = 23:4G:运行内存
                String[] split = prop.split(":");
                if (split!=null && split.length==3){
                    // 将对应的数据放入map 集合
                    HashMap<String, String> map = new HashMap<>();
                    map.put("attrId",split[0]);
                    map.put("attrValue",split[1]);
                    map.put("attrName",split[2]);
                    // 将map 对应添加到集合
                    list.add(map);
                }
            }
        }
        return list;
    }
    // 获取品牌显示
    private String makeTrademark(String trademark){
        // trademark=2:华为
        if (!StringUtils.isEmpty(trademark)){
            String[] split = trademark.split(":");
            if (split!=null && split.length==2){
                return "品牌："+ split[1];
            }
        }
        return "";
    }
    // 拼接url 参数
    private String makeUrlParam(SearchParam searchParam) {
        // 声明一个拼接字符串
        StringBuilder urlParam = new StringBuilder();
        // 判断是否通过关键字检索
        // http://list.gmall.com/list.html?keyword=手机
        if (searchParam.getKeyword()!=null){
            urlParam.append("keyword=").append(searchParam.getKeyword());
        }

        // 判断是否通过分类Id 检索
        // http://list.gmall.com/list.html?category1Id=2
        if(searchParam.getCategory1Id()!=null){
            urlParam.append("category1Id=").append(searchParam.getCategory1Id());
        }
        // http://list.gmall.com/list.html?category2Id=13
        if(searchParam.getCategory2Id()!=null){
            urlParam.append("category2Id=").append(searchParam.getCategory2Id());
        }
        // http://list.gmall.com/list.html?category3Id=61
        if(searchParam.getCategory3Id()!=null){
            urlParam.append("category3Id=").append(searchParam.getCategory3Id());
        }

        // 还可以通过品牌检索
        // http://list.gmall.com/list.html?category3Id=61&trademark=2:华为
        if(searchParam.getTrademark()!=null){
            // trademark=2:华为
            if (urlParam.length()>0){
                // 在检索入口的基础之上，拼接品牌查询条件
                urlParam.append("&trademark=").append(searchParam.getTrademark());
            }
        }
        // 还可以通过平台属性值检索
        if (searchParam.getProps()!=null){
            // String[] props = searchParam.getProps();
            // 循环获取数组中的数据
            for (String prop : searchParam.getProps()) {
                // http://list.gmall.com/list.html?category3Id=61&trademark=2:华为&props=23:4G:运行内存&props=20:128G:机身存储
                // props=23:4G:运行内存
                if (urlParam.length()>0){
                    // 在检索入口的基础之上，拼接品牌查询条件
                    urlParam.append("&props=").append(prop);
                }
            }
        }
        return "list.html?"+urlParam.toString();
    }
}
